<?php

namespace org\copperforest\oak;

/**
 * Clase que define los eventos que se producen desde el sistema gráfico
 * @author Alejandro Gama Castro <alejandro.gama@gmail.com>
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
 * @version 1.0
 * @package oak
 */
class Event
{

    /**
     * Etiqueta del evento
     * @var string
     */
    public $tag;

    /**
     * Id del nodo que lanzó el evento
     * @access private
     * @var Node
     */
    private $_sourceId;

    /**
     * Authority del nodo que lanzó el evento
     * @access private
     * @var Node
     */
    public $_sourceAuthority;

    /**
     * Authority del nodo que lanzó el evento
     * @access private
     * @var Node
     */
    public $_sourceGroup;

    /**
     * Metódo de la llamada web. Toma uno de los siguientes valores {@see Node::POST} ó {@see Node::GET}
     * @var int
     */
    public $method;

    /**
     * Valor que indica si el evento sigue burbujeando hacia en nodo root
     * @var boolean
     */
    public $bubble = true;

    /**
     * Array para compartir datos entre los objetos que reciben el evento
     * @var array
     */
    public $share = array( );

    /**
     * Método constructor del evento
     * @access private
     * @param string $tag
     */
    function __construct( $tag )
    {
        $this->tag = $tag;
        $this->method = ((strtolower( $_SERVER[ 'REQUEST_METHOD' ] ) === 'post') ? 1 : 0);
    }

    /**
     * Método que para el burbujeo del evento hacia el nodo root
     * @return void
     */
    public function cancelBubble()
    {
        $this->bubble = false;
    }

    /**
     * Método que hace continuar el burbujeo del evento si previamente se ha parado
     * @return void
     */
    public function continueBubble()
    {
        $this->bubble = true;
    }

    /**
     * Método que devuelve el Nodo que generó el evento
     * @return Node
     */
    public function getSource()
    {
        return Node::getInstance( $this->_sourceAuthority, $this->_sourceId,
                        $this->_sourceGroup, true );
    }

    /**
     * Método que establece el Nodo que generó el evento
     * @access private
     * @return void
     */
    public function _setSource( $authority, $group, $idB64 )
    {
        $this->_sourceAuthority = $authority;
        $this->_sourceGroup = $group;
        $this->_sourceId = $idB64;
    }

}

?>